//package com.fqgj.xjd.user.job;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.annotation.JSONField;
//import com.dangdang.ddframe.job.api.ShardingContext;
//import com.dangdang.ddframe.job.api.simple.SimpleJob;
//import com.fasterxml.jackson.annotation.JsonInclude;
//import com.fqgj.common.api.Page;
//import com.fqgj.common.utils.CollectionUtils;
//import com.fqgj.common.utils.StringUtils;
//import com.fqgj.log.factory.LogFactory;
//import com.fqgj.log.interfaces.Log;
//import com.fqgj.xjd.user.common.enums.TaskStatusEnum;
//import com.fqgj.xjd.user.common.enums.TaskTypeEnum;
//import com.fqgj.xjd.user.common.utils.HttpHandle;
//import com.fqgj.xjd.user.config.ApolloConfigUtil;
//import com.fqgj.xjd.user.dao.*;
//import com.fqgj.xjd.user.entity.*;
//import com.fqgj.xjd.user.service.UserKycTaskService;
//import com.google.common.base.Joiner;
//import com.google.common.base.Splitter;
//import com.google.common.base.Strings;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.util.*;
//import java.util.function.Function;
//
///**
// * 获取KYC信息爬虫结果
// */
//
//@Component
//public class KycAuthTask implements SimpleJob {
//    private static final Logger LOGGER = LoggerFactory.getLogger(KycAuthTask.class);
//
//    @Autowired
//    private TTaskCenterDao tTaskCenterDao;
//    @Autowired
//    private UserKycVoterAuthResultDao userKycVoterAuthResultDao;
//    @Autowired
//    private UserKycDriverLicenseResultDao userKycDriverLicenseResultDao;
//    @Autowired
//    private ApolloConfigUtil apolloConfigUtil;
//    @Autowired
//    private CityPinCodeDao cityPinCodeDao;
//    @Autowired
//    private UserBaseResidentDao userBaseResidentDao;
//    @Autowired
//    private UserBaseDao userBaseDao;
//
//    /**
//     * 提交任务
//     */
//    private static final String KYC_CRAWLER_TASK = "/api/cashmama/search";
//    /**
//     * 获取任务状态
//     */
//    private static final String KYC_CRAWLER_STATUS = "/api/cashmama/status";
//    /**
//     * 获取查询结果
//     */
//    private static final String KYC_CRAWLER_RESULT = "/api/cashmama/data";
//    /**
//     * 成功获取数据
//     */
//    private static final String QUERY_SUCCESS = "31030";
//
//    /**
//     * 响应码 请求成功
//     */
//    private static final String REQUEST_SUCCESS = "0";
//
//    private static Map<String, String> mp = Maps.newConcurrentMap();
//
//    static {
//        mp.put("ANDAMAN & NICOBAR ISLANDS",    "Andaman and Nicobar Islands");
//        mp.put("ANDHRA PRADESH", "Andhra Pradesh");
//        mp.put("ASSAM", "Assam");
//        mp.put("BIHAR", "Bihar");
//        mp.put("CHANDIGARH", "Chandigarh");
//        mp.put("CHHATTISGARH", "Chhattisgarh");
//        mp.put("DELHI", "Delhi");
//        mp.put("GOA", "Goa");
//        mp.put("GUJARAT", "Gujarat");
//        mp.put("HARYANA", "Haryana");
//        mp.put("HIMACHAL PRADESH", "HimachalPradesh");
//        mp.put("JHARKHAND", "Jharkhand");
//        mp.put("KARNATAKA", "Karnataka");
//        mp.put("KERALA", "Kerala");
//        mp.put("LAKSHADWEEP", "Lakshadweep");
//        mp.put("MADHYA PRADESH", "Madhya Pradesh");
//        mp.put("MAHARASHTRA", "Maharashtra");
//        mp.put("MANIPUR", "Manipur");
//        mp.put("MEGHALAYA", "Meghalaya");
//        mp.put("MIZORAM", "Mizoram");
//        mp.put("NAGALAND", "Nagaland");
//        mp.put("ODISHA", "Odisha");
//        mp.put("PUNJAB", "Punjab");
//        mp.put("RAJASTHAN", "Rajasthan");
//        mp.put("SIKKIM", "Sikkim");
//        mp.put("TAMILNADU", "TamilNadu");
//        mp.put("TELANGANA", "Telangana");
//        mp.put("TRIPURA", "Tripura");
//        mp.put("UTTAR PRADESH", "Uttar Pradesh");
//        mp.put("UTTARAKHAND", "Uttarakhand");
//        mp.put("WEST BENGAL", "West Bengal");
//        mp.put("DADRA & NAGAR HAVELI",         "Dadra and Nagar Haveli");
//        mp.put("DAMAN & DIU",                  "Diu-Daman");
//        mp.put("JAMMU & KASHMIR",              "JammuKashmir");
//        mp.put("PONDICHERRY",                  "Puducherry");
//        mp.put("ARUNACHAL PRADESH",            "ArunachalPradesh");
//    }
//
//    @Override
//    public void execute(ShardingContext shardingContext) {
////        LOGGER.info("== Start the Reptilian Mission  ==");
//        Page page = new Page(100);
//        List<TTaskCenterEntity> tradeTaskCenterList = tTaskCenterDao.selectListByStatusAndPage(getTaskStatus(), page);
//        if (CollectionUtils.isEmpty(tradeTaskCenterList)) {
//            LOGGER.info("List<TTaskCenterEntity> is empty");
//            return;
//        }
////        LOGGER.info("==List<TTaskCenterEntity> is {}", JSONObject.toJSONString(tradeTaskCenterList));
//        for (TTaskCenterEntity taskCenterEntity : tradeTaskCenterList) {
//            try {
//                switch (taskCenterEntity.getTaskType()) {
//                    case 1:
//                        voterIdTaskSubmit(taskCenterEntity);
//                        break;
//                    case 2:
//                        voterIdTaskResult(taskCenterEntity);
//                        break;
//                    case 3:
//                        driverLicenseTaskSubmit(taskCenterEntity);
//                        break;
//                    case 4:
//                        driverLicenseTaskResult(taskCenterEntity);
//                        break;
//                    default:
//                        break;
//                }
//
//            } catch (Exception e) {
//                taskFailed(taskCenterEntity, "", e.getMessage());
//                LOGGER.error("== task failed, userCode =" + taskCenterEntity.getUserCode() + ",taskType=" + taskCenterEntity.getTaskType(), e);
//            }
//        }
//    }
//
//    /**
//     * 提交voter信息爬虫任务
//     */
//    private void voterIdTaskSubmit(TTaskCenterEntity taskCenterEntity) {
//        // 获取pinCode对应的stateName
//        String state = getState(taskCenterEntity);
//        if (StringUtils.isEmpty(state)) {
//            taskFailed(taskCenterEntity, "", "NONE STATE DATA");
//            return;
//        }
//        VoterTaskReq req = new VoterTaskReq();
//        req.setIdNumber(taskCenterEntity.getKycIdNumber());
//        req.setState(state.toUpperCase());
//        req.setSecrectKey(apolloConfigUtil.getAuthCrawlerBaseSecret());
//        req.setUserCode(taskCenterEntity.getUserCode());
//        UserKycTaskService<VoterTaskReq, TTaskCenterEntity> voterIdTaskService = new VoterIdTaskService<>();
//        voterIdTaskService.submitTask(req, taskCenterEntity);
//    }
//
//    /**
//     * 获取voter信息爬虫任务结果
//     */
//    private void voterIdTaskResult(TTaskCenterEntity taskCenterEntity) {
//        VoterTaskReq req = new VoterTaskReq();
//        req.setTaskId(taskCenterEntity.getTaskId());
//        req.setSecrectKey(apolloConfigUtil.getAuthCrawlerBaseSecret());
//        UserKycTaskService<VoterTaskReq, TTaskCenterEntity> voterIdTaskService = new VoterIdTaskService<>();
//        voterIdTaskService.getResult(req, taskCenterEntity);
//    }
//
//    /**
//     * 提交DL信息爬虫任务
//     */
//    private void driverLicenseTaskSubmit(TTaskCenterEntity taskCenterEntity) {
//
//        UserBaseEntity userBase = userBaseDao.selectByUserCode(taskCenterEntity.getUserCode());
//        if (Objects.isNull(userBase)) {
//            taskFailed(taskCenterEntity, "", "NONE USER DATA");
//            return;
//        }
//        DriverLicenseReq req = new DriverLicenseReq();
//        req.setIdNumber(taskCenterEntity.getKycIdNumber());
//        req.setBirthday(Joiner.on("-").join(getBirthday(userBase)));
//        req.setSecrectKey(apolloConfigUtil.getAuthCrawlerBaseSecret());
//        req.setUserCode(taskCenterEntity.getUserCode());
//        UserKycTaskService<DriverLicenseReq, TTaskCenterEntity> userKycTaskService = new DriverLicenseService<>();
//        userKycTaskService.submitTask(req, taskCenterEntity);
//    }
//
//    /**
//     * 获取DL信息爬虫任务结果
//     */
//    private void driverLicenseTaskResult(TTaskCenterEntity taskCenterEntity) {
//        DriverLicenseReq req = new DriverLicenseReq();
//        req.setTaskId(taskCenterEntity.getTaskId());
//        req.setSecrectKey(apolloConfigUtil.getAuthCrawlerBaseSecret());
//        UserKycTaskService<DriverLicenseReq, TTaskCenterEntity> driverLicenseService = new DriverLicenseService<>();
//        driverLicenseService.getResult(req, taskCenterEntity);
//    }
//
//    /**
//     * 获取需要执行的任务状态
//     */
//    private List<Integer> getTaskStatus() {
//        List<Integer> status = new ArrayList<>(2);
//        status.add(TaskStatusEnum.INIT.getStatus());
//        status.add(TaskStatusEnum.FAILED.getStatus());
//        return status;
//    }
//
//    /**
//     * 获取voterId信息
//     */
//    private class VoterIdTaskService<V extends VoterTaskReq, K extends TTaskCenterEntity> implements UserKycTaskService<V, K> {
//
//        @Override
//        public void submitTask(VoterTaskReq voterTaskReq, TTaskCenterEntity taskCenterEntity) {
//            Function<VoterTaskReq, String> converter = JSON::toJSONString;
//            JSONObject result = doSubmitPost(converter.apply(voterTaskReq), apolloConfigUtil.getAuthCrawlerBaseUrl() + KYC_CRAWLER_TASK);
//            if (Objects.isNull(result)) {
//                taskFailed(taskCenterEntity, voterTaskReq.getState(), "NONE DATA FEEDBACK");
//                return;
//            }
//            String taskId = result.getString("task_id");
//            taskSuccess(taskCenterEntity, voterTaskReq.getState(), taskId);
//            tTaskCenterDao.addTask(taskCenterEntity.getUserCode(), taskCenterEntity.getKycIdNumber(), TaskTypeEnum.QUERY_VOTER_ID.getType(), taskId, voterTaskReq.getState());
//
//        }
//
//        @Override
//        public void getResult(VoterTaskReq voterTaskReq, TTaskCenterEntity taskCenterEntity) {
//            Function<VoterTaskReq, String> converter = JSON::toJSONString;
//            String queryParams = converter.apply(voterTaskReq);
//            GetQueryDataByTaskId resultData = new GetQueryDataByTaskId(taskCenterEntity, queryParams).invoke();
//            if (resultData.failedQueryData()) return;
//            JSONObject result = resultData.getResult();
//            UserKycVoterAuthResultEntity entity = buildUserKycVoterAuthResultEntity(taskCenterEntity, result.getString("data"));
//            userKycVoterAuthResultDao.addUserKycVoterAuthResult(entity);
//            taskSuccess(taskCenterEntity, "", taskCenterEntity.getTaskId());
//        }
//
//        private UserKycVoterAuthResultEntity buildUserKycVoterAuthResultEntity(TTaskCenterEntity tTaskCenterEntity, String result ) {
//            UserKycVoterAuthResultEntity entity =
//            JSONObject.parseObject(result, UserKycVoterAuthResultEntity.class);
//            entity.setUserCode(tTaskCenterEntity.getUserCode());
//            return entity;
//        }
//
//
//    }
//
//    /**
//     * 获取DL信息
//     */
//    private class DriverLicenseService<V extends DriverLicenseReq, K extends TTaskCenterEntity> implements UserKycTaskService<V, K> {
//
//        @Override
//        public void submitTask(DriverLicenseReq driverLicenseReq, TTaskCenterEntity taskCenterEntity) {
//
//            Function<DriverLicenseReq, String> converter = JSON::toJSONString;
//            JSONObject result = doSubmitPost(converter.apply(driverLicenseReq), apolloConfigUtil.getAuthCrawlerBaseUrl() + KYC_CRAWLER_TASK);
//            if (Objects.isNull(result)) {
//                taskFailed(taskCenterEntity, driverLicenseReq.getBirthday(),"NONE DATA FEEDBACK");
//                return;
//            }
//            String taskId = result.getString("task_id");
//            taskSuccess(taskCenterEntity, driverLicenseReq.getBirthday(), taskId);
//            tTaskCenterDao.addTask(taskCenterEntity.getUserCode(), taskCenterEntity.getKycIdNumber(), TaskTypeEnum.QUERY_DRIVER_LICENSE.getType(), taskId, driverLicenseReq.getBirthday());
//
//        }
//
//        @Override
//        public void getResult(DriverLicenseReq driverLicenseReq, TTaskCenterEntity taskCenterEntity) {
//            Function<DriverLicenseReq, String> converter = JSON::toJSONString;
//            String queryParams = converter.apply(driverLicenseReq);
//            GetQueryDataByTaskId resultData = new GetQueryDataByTaskId(taskCenterEntity, queryParams).invoke();
//            if (resultData.failedQueryData()) return;
//            JSONObject result = resultData.getResult();
//            UserKycDriverLicenseResultEntity entity = buildUserKycDriverLicense(taskCenterEntity, result.getJSONObject("data"));
//            userKycDriverLicenseResultDao.addUserKycDriverLicenseResult(entity);
//            taskSuccess(taskCenterEntity, "", taskCenterEntity.getTaskId());
//        }
//
//        private UserKycDriverLicenseResultEntity buildUserKycDriverLicense(TTaskCenterEntity taskCenterEntity, JSONObject data) {
//            return new UserKycDriverLicenseResultEntity().setUserCode(taskCenterEntity.getUserCode())
//                .setDriverLicense(Strings.nullToEmpty(data.getString("driver_license")))
//                .setHolderName(Strings.nullToEmpty(data.getString("holder_name")))
//                .setCurrentStatus(Strings.nullToEmpty(data.getString("current_status")))
//                .setIssueDate(Strings.nullToEmpty(data.getString("issue_date")))
//                .setLastTranscation(Strings.nullToEmpty(data.getString("last_transaction")))
//                .setValidity(Strings.nullToEmpty(data.getString("validity")))
//                .setClassList(Strings.nullToEmpty(data.getString("class_list")));
//        }
//    }
//
//
//    @JsonInclude(JsonInclude.Include.NON_NULL)
//    private class VoterTaskReq {
//        // 任务ID
//        @JSONField(name ="task_id")
//        private String taskId;
//        // 证件号
//        @JSONField(name ="voter_id")
//        private String idNumber;
//
//        @JSONField(name = "state")
//        private String state;
//
//        @JSONField(name = "secret_key")
//        private String secrectKey;
//
//        @JSONField(name="user_code")
//        private String userCode;
//
//        public String getUserCode() {
//            return userCode;
//        }
//
//        public void setUserCode(String userCode) {
//            this.userCode = userCode;
//        }
//
//        public String getSecrectKey() {
//            return secrectKey;
//        }
//
//        public void setSecrectKey(String secrectKey) {
//            this.secrectKey = secrectKey;
//        }
//
//        public String getTaskId() {
//            return taskId;
//        }
//
//        public void setTaskId(String taskId) {
//            this.taskId = taskId;
//        }
//
//        public String getIdNumber() {
//            return idNumber;
//        }
//
//        public void setIdNumber(String idNumber) {
//            this.idNumber = idNumber;
//        }
//
//        public String getState() {
//            return state;
//        }
//
//        public void setState(String state) {
//            this.state = state;
//        }
//    }
//
//    @JsonInclude(JsonInclude.Include.NON_NULL)
//    private class DriverLicenseReq {
//
//        @JSONField(name ="task_id")
//        private String taskId;
//
//        @JSONField(name = "birth_date")
//        private String birthday;
//
//        @JSONField(name = "driver_license")
//        private String idNumber;
//
//        @JSONField(name = "secret_key")
//        private String secrectKey;
//
//        @JSONField(name="user_code")
//        private String userCode;
//
//        public String getUserCode() {
//            return userCode;
//        }
//
//        public void setUserCode(String userCode) {
//            this.userCode = userCode;
//        }
//
//        public String getSecrectKey() {
//            return secrectKey;
//        }
//
//        public void setSecrectKey(String secrectKey) {
//            this.secrectKey = secrectKey;
//        }
//
//        public String getTaskId() {
//            return taskId;
//        }
//
//        public void setTaskId(String taskId) {
//            this.taskId = taskId;
//        }
//
//        public String getBirthday() {
//            return birthday;
//        }
//
//        public void setBirthday(String birthday) {
//            this.birthday = birthday;
//        }
//
//        public String getIdNumber() {
//            return idNumber;
//        }
//
//        public void setIdNumber(String idNumber) {
//            this.idNumber = idNumber;
//        }
//    }
//
//    private class GetQueryDataByTaskId {
//        private boolean failedQueryDataFlag;
//        private TTaskCenterEntity taskCenterEntity;
//        private String queryParams;
//        private JSONObject result;
//
//        public GetQueryDataByTaskId(TTaskCenterEntity taskCenterEntity, String queryParams) {
//            this.taskCenterEntity = taskCenterEntity;
//            this.queryParams = queryParams;
//        }
//
//        boolean failedQueryData() {
//            return failedQueryDataFlag;
//        }
//
//        public JSONObject getResult() {
//            return result;
//        }
//
//        public GetQueryDataByTaskId invoke() {
//            // 查询任务状态
//            result = doQueryResultPost(queryParams, apolloConfigUtil.getAuthCrawlerBaseUrl() + KYC_CRAWLER_STATUS);
//            if (Objects.isNull(result)) {
//                taskFailed(taskCenterEntity, "", "NONE DATA FEEDBACK");
//                failedQueryDataFlag = true;
//                return this;
//            }
//            // 判断接口状态
//            String code = result.getString("code");
//            if (!Objects.equals(REQUEST_SUCCESS, code)) {
//                taskFailed(taskCenterEntity, "", result.toJSONString());
//                failedQueryDataFlag = true;
//                return this;
//            }
//
//            // 判断任务状态
//            JSONArray stateArray = result.getJSONArray("state");
//            JSONObject state = stateArray.getJSONObject(stateArray.size() - 1);
//            if (!QUERY_SUCCESS.equals(state.getString("code"))) {
//                taskFailed(taskCenterEntity, "", state.toJSONString());
//                failedQueryDataFlag = true;
//                return this;
//            }
//
//            // 获取查询结果
//            result = doQueryResultPost(queryParams, apolloConfigUtil.getAuthCrawlerBaseUrl() + KYC_CRAWLER_RESULT);
//            if (Objects.isNull(result)) {
//                taskFailed(taskCenterEntity, "", "NONE DATA FEEDBACK");
//                failedQueryDataFlag = true;
//                return this;
//            }
//            code = result.getString("code");
//            if (!Objects.equals(REQUEST_SUCCESS, code) || StringUtils.isEmpty(result.getString("data"))) {
//                taskFailed(taskCenterEntity, "", result.toJSONString());
//                failedQueryDataFlag = true;
//                return this;
//            }
//            failedQueryDataFlag = false;
//            return this;
//        }
//    }
//
//    private List<String> getBirthday(UserBaseEntity userBase) {
//        String birthday = Strings.nullToEmpty(userBase.getBirthday());
//        List<String> ddMMyy = Splitter.on("-").trimResults().omitEmptyStrings().splitToList(birthday);
//        return Lists.newArrayList(ddMMyy.get(2), ddMMyy.get(1), ddMMyy.get(0));
//    }
//
//    private void taskFailed(TTaskCenterEntity task, String req, String errorMsg) {
//        task.setTaskStatus(TaskStatusEnum.FAILED.getStatus());
//        task.setTaskRetryTimes(Objects.isNull(task.getTaskRetryTimes()) ? 1 : task.getTaskRetryTimes() + 1 );
//        task.setResultMsg(errorMsg);
//        if (StringUtils.isNotEmpty(req)) {
//            task.setReqParams(req);
//        }
//        tTaskCenterDao.updateByPrimaryKey(task);
//    }
//
//    private void taskSuccess(TTaskCenterEntity task, String req, String taskId) {
//        task.setTaskStatus(TaskStatusEnum.SUCCESS.getStatus());
//        task.setTaskId(taskId);
//        if (StringUtils.isNotEmpty(req)) {
//            task.setReqParams(req);
//        }
//        task.setResultMsg("");
//        tTaskCenterDao.updateByPrimaryKey(task);
//    }
//
//    private JSONObject doSubmitPost(String req, String url) {
//        JSONObject feedBack = doQueryResultPost(req, url);
//        if (Objects.isNull(feedBack)) {
//            return null;
//        }
//        String code = feedBack.getString("code");
//        if (Objects.equals(REQUEST_SUCCESS, code)) {
//            return feedBack;
//        }
//        LOGGER.error("Task failed, req is {}, errorMsg is ", req, feedBack.toJSONString());
//        return null;
//    }
//
//    private JSONObject doQueryResultPost(String req, String url) {
//
//        try {
////            LOGGER.info("requestParams is {}", req);
//            String result = HttpHandle.requestPostString(req, url);
//            if (StringUtils.isEmpty(result)) {
//                return null;
//            }
//            return JSONObject.parseObject(result);
//        } catch (Exception e) {
//            LOGGER.error("Task failed, req is {}", req, e);
//            return null;
//        }
//    }
//
//    /**
//     * 获取pinCode 对应的stateName
//     */
//    private String getState(TTaskCenterEntity taskCenterEntity) {
//        UserBaseResidentEntity userResident = userBaseResidentDao.selectByUserCode(taskCenterEntity.getUserCode());
//        if (Objects.isNull(userResident) || StringUtils.isEmpty(userResident.getPermanentPinCode())) {
//            return null;
//        }
//        Map<String, Object> params = Maps.newConcurrentMap();
//        params.put("pincode", userResident.getPermanentPinCode());
//        params.put("isDeleted", 0);
//        List<CityPinCodeEntity> cityPinCodeEntities = cityPinCodeDao.selectByParams(params);
//
//        if (CollectionUtils.isEmpty(cityPinCodeEntities)) {
//            return null;
//        }
//        String stateName = cityPinCodeEntities.get(0).getStatename();
//        if (mp.containsKey(stateName)) {
//            return mp.get(stateName);
//        }
//        return stateName;
//    }
//
//
//}
